#include <stdio.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

using namespace std;

static __global__ void test_kernel() {
    // 方式3，使用extern声明外部的动态大小共享内存（动态的意思时在调用核函数时指定共享内存大小），由启动核函数的第三个参数指定
    extern __shared__ int shared_array[];  // 注意，动态共享内存不能指定数组大小。并且动态内存变量只能指定1个。

    if (threadIdx.x == 0) {
        shared_array[0] = blockIdx.x;
        shared_array[6] = blockIdx.x + 6;  // 这里写超了没有报错，需要注意
        shared_array[49152/sizeof(int) + 10] = 12;
    }

    __syncthreads();

    printf("thread[%d,%d] shared_array[0]=%d, shared_array[6]=%d\n", 
            blockIdx.x, threadIdx.x, shared_array[0], shared_array[6]);
    
}

int main() {
    // test_kernel<<<3, 2, sizeof(__int32_t) * 5>>>();
    test_kernel<<<3, 2, 49153 + 5>>>();
    cudaDeviceSynchronize();
    return 0;
}